package com.lyz.redis.service;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.ObjectUtils;

import java.util.Collection;
import java.util.List;
import java.util.concurrent.TimeUnit;

public class ListRedisService<V> extends RedisService<String,V>{

    public ListRedisService(RedisTemplate<String, V> redisTemplate) {
        super(redisTemplate);
    }

    /**
     * 获取list集合
     * @param k
     * @return
     */
    public List<V> get(String k){
        Long size = redisTemplate.opsForList().size(k);
        if (ObjectUtils.isEmpty(size)) return null;
        return redisTemplate.opsForList().range(k,0,size);
    }

    /**
     * 存储集合值
     * @param k 键
     * @param values 集合值
     * @return 保存数据数量
     */
    public Long set(String k, Collection<V> values){
        return redisTemplate.opsForList().rightPushAll(k,values);
    }

    /**
     * 在已有的key上添加value
     * @param k 键
     * @param v 值
     */
    public Long add(String k,V v){
        return redisTemplate.opsForList().rightPush(k,v);
    }

    //

    /**
     * 移出并获取列表的第一个元素，
     * 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
     * @param k 键
     * @return first element
     */
    public V getFirstAndDel(String k){
        return redisTemplate.opsForList().leftPop(k,1, TimeUnit.SECONDS);
    }

    /**
     * 移出并获取列表的最后一个元素，
     * 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
     * @param k 键
     * @return last element
     */
    public V getLastAndDel(String k){
        return redisTemplate.opsForList().rightPop(k);
    }

    public V get(String k, Integer index){
        return redisTemplate.opsForList().index(k,index);
    }

    public Long size(String k){
        return redisTemplate.opsForList().size(k);
    }
}
